package cn.dduan.fool.thread;

/**
 * ThreadLocal
 * 意为线程本地变量，用于解决多线程并发时访问共享变量的问题
 * 小结：
 * 1、解决线程安全问题
 * 2、为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题
 * 3、ThreadLocal 比直接使用 synchronized 同步机制解决线程安全问题更简单，更方便，且程序拥有更高的并发性
 *
 * @author dduan
 * @version 1.0
 * @date 2023/4/6
 */
public class MyThreadLocal {
    private static ThreadLocal<String> local = new ThreadLocal<>();

    /**
     * 单线程使用案例
     *
     * @param
     * @return void
     * @author dduan
     * @version 1.0
     * @date 2023/4/6
     */
    private void pool() {
        String tName = Thread.currentThread().getName();
        MyThreadLocal.local.set(tName);
        System.out.println(local.get());
        local.remove();
        System.out.println(tName + " remove success " + local.get());
    }

    /**
     * 多线程使用案例
     * 
     * @param 
     * @return void
     * @author dduan
     * @version 1.0
     * @date 2023/4/6
     */
    private void pools() {
        new Thread(() -> {
            local.set(Thread.currentThread().getName());
            try {
                // 等待5000毫秒，确保threadTwo 执行remove完成
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(local.get());
        }).start();

        new Thread(() -> {
            String tName = Thread.currentThread().getName();
            local.set(tName);
            local.remove();
            System.out.println(tName + " remove success");
        }).start();
    }

    public static void main(String[] args) {
        MyThreadLocal m = new MyThreadLocal();
        // 单线程
        m.pool();
        // 多线程
        m.pools();
    }
}
